home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CD Fun House 8
/
CD Funhouse Version 8.0 - Wayzata Technology (7013) (1993).iso
/
pc
/
pc
/
boards
/
tarot
/
tarot.pas
< prev
Wrap
Pascal/Delphi Source File
|
1990-01-04
|
11KB
|
332 lines
{$A+,B-,D+,E-,F-,I-,L+,N-,O-,R-,S-,V+}
{$M 16384,0,0}
PROGRAM TAROT;
USES DOS,CRT,PRINTER;
TYPE
DECK_TYPE = ARRAY [0..21] OF BYTE;
CUT_TYPE = ARRAY [1..4] OF BYTE;
CARD_TYPE = RECORD
NAME :STRING[14];
ROMAN :STRING[5];
MEANING :STRING[75];
END;
CONST
EFFECTON=#27#71; {printer effect on "card" - doublestrike}
EFFECTOFF=#27#72;
CARD:ARRAY [0..21] OF CARD_TYPE=(
(NAME:' The Fool ';ROMAN:' 0 ';MEANING: {0}
'Foolishness, Frenzy, Impulsiveness, Heedlessness, Agitation, Blunder '),
(NAME:' The Magician ';ROMAN:' I ';MEANING: {1}
'Skill, Artistry, Assurance, Determination, Versatility, Competence '),
(NAME:'High Priestess';ROMAN:' II ';MEANING: {2}
'Knowledge, Intelligence, Understanding, Scholarship, Wisdom '),
(NAME:' The Empress ';ROMAN:' III ';MEANING: {3}
'Activity, Growth, Fertility, Productiveness, Progress '),
(NAME:' The Emperor ';ROMAN:' IV ';MEANING: {4}
'Nobility, Power, Achievement, Supremacy, Wealth, Dominance '),
(NAME:'The Hierophant';ROMAN:' V ';MEANING: {5}
'Gentleness, Sacredness, Benevolence, Leniency, Righteousness, Tenderness '),
(NAME:' The Lovers ';ROMAN:' VI ';MEANING: {6}
'Attraction, Loveliness, Affection, Elegance, Concord '),
(NAME:' The Chariot ';ROMAN:' VII ';MEANING: {7}
'Domination, Triumph, Discord, Victory, Trouble, Challenge '),
(NAME:' Strength ';ROMAN:'VIII ';MEANING: {8}
'Fortitude, Firmness, Confidence, Assurance '),
(NAME:' The Hermit ';ROMAN:' IX ';MEANING: {9}
'Discretion, Tact, Judiciousness, Heed, Circumspection, Preparedness '),
(NAME:'Wheel Fortune';ROMAN:' X ';MEANING: {10}
'Providence, Predestination, Authority, Honor, Principle '),
(NAME:' Justice ';ROMAN:' XI ';MEANING: {11}
'Morality, Virtue, Fairness, Rectitude '),
(NAME:'The Hanged Man';ROMAN:' XII ';MEANING: {12}
'Sacrifice, Transcendance, Glory, Renunciation, Piety, Stability '),
(NAME:' Death ';ROMAN:'XIII ';MEANING: {13}
'Great Change, Destination, Rebirth, Creation, Renewal '),
(NAME:' Temperance ';ROMAN:' XIV ';MEANING: {14}
'Harmony, Moderation, Rationality, Friendliness, Forbearance '),
(NAME:' The Devil ';ROMAN:' XV ';MEANING: {15}
'Evil, Catastrophe, Captivity, Disorder, Violence '),
(NAME:' The Tower ';ROMAN:' XVI ';MEANING: {16}
'Ruin, Suffering, Affliction, Chastisement, Unexpectedness, Disaster '),
(NAME:' The Star ';ROMAN:'XVII ';MEANING: {17}
'Truth, Promise, Propitiousness, Fulfillment, Beauty, Immortality '),
(NAME:' The Moon ';ROMAN:'XVIII';MEANING: {18}
'Savagery, Peril, Instability, Falsehood, Disillusionment '),
(NAME:' The Sun ';ROMAN:' XIX ';MEANING: {19}
'Sensitivity, Innocence, Pleasure, Renewal, Restoration, Victory, Perfection'),
(NAME:' Judgement ';ROMAN:' XX ';MEANING: {20}
'Discovery, Development, Resolution, Conclusion '),
(NAME:' The World ';ROMAN:' XXI ';MEANING: {21}
'Culmination, Triumph, Self-Awareness, Natural Perfection '));
QUESTION:ARRAY [0..9] OF STRING[75]=(
'The influence affecting the questioner; the atmosphere around the question ',
'The obstacles facing the questioner ',
'The most practical goal that the questioner can achieve or avoid ',
'The Present ',
'The Past ',
'The Future ',
'The questioner''s frame of mind ',
'The questioner''s enviroment, position in life, what his/her friends think ',
'The questioner''s fears, hopes, or predictions ',
'The final outcome, what this will end up as ');
VAR
DECK :DECK_TYPE;
TIMES,
W :WORD;
I :BYTE;
CH :CHAR;
CUTPOINT :CUT_TYPE;
{-------------------------------------------------------------}
PROCEDURE WAIT;
VAR
X,Y :BYTE;
BEGIN
X:=WHEREX; Y:=WHEREY;
GOTOXY (1,25);
WRITE ('Press any key to continue....');
CH:=READKEY;
GOTOXY (X,Y);
END;
{-------------------------------------------------------------}
PROCEDURE SHUFFLE (TIMES :WORD);
VAR
T :WORD;
B,
NUM1,
NUM2 :BYTE;
BEGIN
RANDOMIZE;
FOR I:=0 TO 21 DO
DECK[I]:=I;
FOR T:=1 TO TIMES DO
BEGIN
IF T MOD 100=0
THEN
BEGIN
GOTOXY (1,WHEREY); CLREOL;
WRITE ('Shuffling...',T);
END;
FOR I:=1 TO 10 DO
BEGIN
NUM1:=RANDOM(22);
NUM2:=RANDOM(22);
B:=DECK[NUM1];
DECK[NUM1]:=DECK[NUM2];
DECK[NUM2]:=B;
END;
END;
END;
{-------------------------------------------------------------}
PROCEDURE CUT;
VAR
TEMPDECK :DECK_TYPE;
J,
B :BYTE;
LOOP :BOOLEAN;
BEGIN
LOOP:=TRUE;
REPEAT
IF CUTPOINT[1]<CUTPOINT[2]
THEN BEGIN IF CUTPOINT[2]<CUTPOINT[3]
THEN BEGIN LOOP:=FALSE END
ELSE
BEGIN
B:=CUTPOINT[2];
CUTPOINT[2]:=CUTPOINT[3];
CUTPOINT[3]:=B;
END;
END
ELSE
BEGIN
B:=CUTPOINT[1];
CUTPOINT[1]:=CUTPOINT[2];
CUTPOINT[2]:=B;
END;
UNTIL LOOP=FALSE;
IF CUTPOINT[4]>14
THEN
BEGIN
I:=0;
FOR B:=CUTPOINT[3] TO 21 DO
BEGIN TEMPDECK[I]:=DECK[B]; I:=I+1; END;
FOR B:=0 TO CUTPOINT[3]-1 DO
BEGIN TEMPDECK[I]:=DECK[B]; I:=I+1; END;
DECK:=TEMPDECK;
END
ELSE
IF CUTPOINT[4]>7
THEN
BEGIN
I:=0;
J:=RANDOM(2)+1;
FOR B:=CUTPOINT[J] TO 21 DO
BEGIN TEMPDECK[I]:=DECK[B]; I:=I+1; END;
FOR B:=0 TO CUTPOINT[J]-1 DO
BEGIN TEMPDECK[I]:=DECK[B]; I:=I+1; END;
DECK:=TEMPDECK;
END;
END;
{-------------------------------------------------------------}
PROCEDURE SETUP;
VAR
A,B,C,X,Y :BYTE;
BEGIN
FOR Y:=0 TO 1 DO
FOR X:=0 TO 4 DO
BEGIN
IF X=4
THEN WINDOW (X*16+1,Y*10+1,80,25)
ELSE WINDOW (X*16+1,Y*10+1,X*16+16,Y*10+11);
WRITE ('⁄ƒƒƒƒƒƒƒƒƒƒƒƒƒƒø');
FOR A:=1 TO 8 DO
BEGIN
IF A MOD 2=0
THEN WRITE ('≥±≤±≤±≤±≤±≤±≤±≤≥')
ELSE WRITE ('≥≤±≤±≤±≤±≤±≤±≤±≥');
END;
WRITE ('¿ƒƒƒƒƒƒƒƒƒƒƒƒƒƒŸ');
END;
WINDOW (1,1,80,25);
END;
{-------------------------------------------------------------}
PROCEDURE SHOW;
VAR
X,Y :BYTE;
BEGIN
CLRSCR;
SETUP;
WAIT;
I:=0;
FOR Y:=0 TO 1 DO
FOR X:= 0 TO 4 DO
BEGIN
WINDOW (X*16+2,Y*10+2,X*16+15,Y*10+9);
CLRSCR;
GOTOXY (5,2);
WRITE (CARD[DECK[I]].ROMAN);
GOTOXY (1,7); HIGHVIDEO;
IF DECK[I]=10
THEN
BEGIN
GOTOXY (3,6); WRITE ('Wheel of');
GOTOXY (4,7); WRITE ('Fortune');
END
ELSE WRITE (CARD[DECK[I]].NAME);
LOWVIDEO;
WINDOW (1,1,80,25);
GOTOXY (1,21);
WRITELN ('This position concerns: '); HIGHVIDEO;
WRITELN (' ',QUESTION[I]); LOWVIDEO;
WRITELN ('This card means: '); HIGHVIDEO;
WRITELN (' ',CARD[DECK[I]].MEANING); LOWVIDEO;
IF I<9
THEN WAIT;
I:=I+1;
END;
END;
{------------------------------------------------------------}
PROCEDURE PRINT;
VAR
REGS :REGISTERS;
VIDMEMST :WORD;
BEGIN
INTR($11,REGS);
IF LO(REGS.AX) AND $30 = $30
THEN VIDMEMST:=$B000
ELSE VIDMEMST:=$B800;
FOR W:=0 TO 3199 DO
IF W MOD 2=0
THEN WRITE (LST,CHR(MEM[VIDMEMST:W]));
WRITELN (LST);
FOR I:=0 TO 9 DO
BEGIN
WRITELN (LST,EFFECTON,
'Card ',CARD[DECK[I]].ROMAN,'- ',CARD[DECK[I]].NAME,
EFFECTOFF);
WRITELN (LST,' ',QUESTION[I]);
WRITELN (LST,' ',CARD[DECK[I]].MEANING);
END;
WRITELN (LST,^L);
END;
{============================================================}
BEGIN
REPEAT
CLRSCR; LOWVIDEO;
GOTOXY (27,2); WRITELN ('TAROT READER - MAJOR ARCANA');
WRITELN;
WRITELN ('Ask the computer what you would like it to talk about before');
WRITELN ('doing anything else!');
WRITELN;
WRITE ('Enter number of times to shuffle deck: ');
READLN (TIMES);
WRITELN;
WRITELN ('Now enter 4 numbers between 1 and 500 so I can cut the deck.');
FOR I:=1 TO 4 DO
BEGIN
REPEAT
WRITE (' Enter number ',I,': ');
READLN (W);
IF (W<1) OR (W>500)
THEN
BEGIN
GOTOXY (30,WHEREY-1);
WRITELN ('<-- Not between 1 and 500!',^G);
END
ELSE
BEGIN
CUTPOINT[I]:=TRUNC(W/22.72727273) - 1;
IF (CUTPOINT[I]>21) OR (CUTPOINT[I]<1)
THEN CUTPOINT[I]:=1;
IF (I>1) AND (I<4)
THEN IF (CUTPOINT[I]=CUTPOINT[I-1]) OR ((I=3) AND
(CUTPOINT[3]=CUTPOINT[1]))
THEN
BEGIN
GOTOXY (30,WHEREY-1);
WRITELN ('<-- I don''t like that number, try again.',^G);
W:=1000;
END;
END;
UNTIL (W>0) AND (W<501);
END;
WRITELN; WRITE ('Shuffling...');
SHUFFLE (TIMES);
CUT;
WRITELN; WRITELN; WRITELN ('Your deck is shuffled, cut and ready to go!');
WAIT;
SHOW;
GOTOXY (1,25); CLREOL;
CH:='X';
WHILE NOT (CH IN ['Q','A']) DO
BEGIN
GOTOXY (1,25); CLREOL;
WRITE ('A)gain, P)rint, Q)uit (A/P/Q)? ');
CH:=UPCASE(READKEY);
IF CH='P'
THEN PRINT
ELSE IF NOT (CH IN ['Q','A'])
THEN WRITE (^G);
END;
UNTIL CH='Q';
NORMVIDEO;
CLRSCR;
END.